const TableFilter = (hook, { ActionButtons, JiessBetween }) => {
	return {
		isJiess: true,
		name: 'TableFilter',
		setup({
			midder,
			// 重置事件
			onReset,
			// 搜索事件
			onSearch,
			// 操作按钮
			buttons,
			// 筛选区变化时调用
			onValuesChange,
			// 筛选区标题
			title = "筛选区",
			// 重置方案
			// 1.加载列表，2.清空列表
			// 其余情况不对列表做处理
			resetPlan = 1,
			...areaParam
		}) {
			const { filter, pager, table, proxy } = midder;
			// 基础的筛选参数
			let baseValues = null;
			// ========================================
			filter.load = (values = { ...baseValues }) => {
				filter.values = values;
				filter.action.setFieldsValue(values);
			};
			filter.toValidate = async () => {
				filter.values = await filter.action.value();
			};
			filter.onSearch = async (callback) => {
				await filter.toValidate();
				// 搜索和筛选均需要重置页码
				pager && (pager.values.page = 1);
				if (typeof onSearch === 'function') {
					onSearch.call(this, filter.values)
				} else if (typeof callback === 'function') {
					callback.call(this, filter.values)
				} else {
					table?.reload();
				}
				// 手动触发时，返回筛选值
				return filter.values;
			};
			filter.onReset = async () => {
				filter.load();
				if (typeof onReset === 'function') {
					onReset.call(this, filter.values)
				} else {
					return await filter.onSearch(() => {
						// 根据既定方案处理列表
						if (resetPlan === 1) {
							table?.reload();
						} else if (resetPlan === 2) {
							if (proxy) {
								proxy.datas = [];
								proxy.total = 0;
							}
						}
					});
				}
			};
			// ========================================
			const area = this.area({
				// 无校验，移除底部间隙
				// hasRule: false,
				$slots: {
					header: () => ({
						is: JiessBetween,
						left: title,
						right: {
							is: ActionButtons,
							buttons: () => {
								return buttons ? buttons : [
									{ text: '搜索', onClick: filter.onSearch, type: 'primary' },
									{ text: '重置', onClick: filter.onReset }
								];
							}
						}
					})
				},
				...areaParam
			});
			// 可以根据需要对筛选区元素进行组装
			filter.action = area.add(Object.values(filter.items)
				.filter((render) => typeof render === 'function')
				.map((render) => render(area))).done();
			// ============================================================
			hook.$m.$watchEffect(() => {
				const result = { ...area.nameManger.values };
				// 基础数据还未初始化，则初始化赋值，作为重置基准
				if (!baseValues) baseValues = { ...result };
				// 向外暴露未经过处理的原始数据
				onValuesChange && onValuesChange(result);
			})
		}
	};
};
export default TableFilter;